import * as express from "express";
import { Server } from "ws";


const app = express();

export class Product {
    constructor (
        public id:number,
        public title:string,
        public price:number,
        public rating:number,
        public desc:string,
        public categories:Array<string>
    ){

    }
}

const products: Product[] = [
    new Product(1,"第一个商品",1.99,3.5,"这是我创建的第一个商品",["电子产品","数码产品"]),
    new Product(2,"第二个商品",2.55,4.0,"这是我创建的第二个商品",["电子产品","大众喜爱"]),
    new Product(3,"第三个商品",3.65,2.5,"这是我创建的第三个商品",["电子产品","数码产品","大众喜爱"]),
    new Product(4,"第四个商品",3.44,4.2,"这是我创建的第四个商品",["数码产品","大众喜爱"]),
    new Product(5,"第五个商品",4.2,3.9,"这是我创建的第五个商品",["电子产品","数码产品","大众喜爱","我的最爱"]),
    new Product(6,"第六个商品",3.88,4.5,"这是我创建的第六个商品",["电子产品","数码产品","大众喜爱"])
];

//声明评论的类
export class Comment {
    constructor(
        public id: number,
        public productId: number,
        public timestamp: string,
        public user: string,
        public rating: number,
        public content: string) {

    }
}

//这个是自己生成评论信息。
const comments:Comment[] = [
    new Comment(1, 1, "2017-02-02 22:22:22", "张三", 3, "东西可以啊"),
    new Comment(2, 1, "2017-03-03 20:22:22", "李四", 4, "东西划算"),
    new Comment(3, 1, "2017-04-04 15:22:22", "王五", 2, "东西挺好的"),
    new Comment(4, 2, "2017-05-05 12:22:22", "赵六", 4, "东西兴奋到头了")
]


app.get("/", (req, res) => {
    res.send("hello express!组织阻止做做");
});

app.get("/api/products", (req, res) => {
    let result = products;
    //实现接受请求的过滤
    let params = req.query;  //这个我们传参的那个集合。是一个对象。

    if (params.title) {
        result = result.filter( (p) => p.title.indexOf(params.title) !== -1);
    }
    if (params.price && result.length > 0) {
        result = result.filter( (p) => p.price <= parseInt(params.price));
    }
    if (params.category && params.category !== "-1" && result.length > 0) {
        console.log("我进入了if判断");
        result = result.filter( (p) => p.categories.indexOf(params.category) !== -1);
    }



    res.json(result);
});

app.get("/api/products/:id", (req, res) => {
    res.json(products.find((product)=> product.id == req.params.id));
});

app.get("/api/products/:id/comments", (req, res) => {
    res.json(comments.filter((comment: Comment) => comment.productId == req.params.id));
});

const server = app.listen(8000, 'localhost', ()=> {
    console.log("服务器已启动,地址是: http://localhost:8000");
});

//下面是websocket。
const subscriptions = new Map<any, number[]>();
const wsServer = new Server({port:8085});
wsServer.on("connection", websocket => {
    websocket.send("这个消息是服务器主动推送的");
    websocket.on("message", message  => {   //接受到客户端的消息后做的事。
        // console.log("接收到消息--"+message);
        console.log("接收到消息--"+message);
        console.log(typeof message);
        let messageObj = JSON.parse(message);
        let productIds = subscriptions.get(websocket)  || [];
        subscriptions.set(websocket, [...productIds, messageObj.productId]);  //接受传递过来的id
    })
});

//存储最新报价的id对应的价格。
const currentBids = new Map<number, number>();

setInterval( () => {
    products.forEach( p => {
        let currentBid = currentBids.get(p.id) || p.price;
        let newBid = currentBid + Math.random()+5;
        currentBids.set(p.id, newBid);
    });
    //推送。
    subscriptions.forEach((productIds: number[], ws) => {
        if(ws.readyState === 1) {
            let newBids = productIds.map( pid => ({
                productId: pid,
                bid: currentBids.get(pid)
            }));
            ws.send(JSON.stringify(newBids));
            // console.log(typeof JSON.stringify(newBids));
        } else {
            subscriptions.delete(ws);
        }
    })


    // if(wsServer.clients) {
    //     wsServer.clients.forEach(client => {
    //         client.send("这是定时推送的消息。")
    //     })
    // }

},2000)

